package controllers; import api.v1.CSVFile; import api.v1.InvoiceData; import auth.modules.TokenAuthorize; import auth.types.PermissionType; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import compositions.*; import exceptions.PoseidonException; import models.InvoiceLine; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import play.libs.Json; import play.mvc.Http; import play.mvc.Result; import service.*; import java.io.*; import java.util.*; @ResponseTimeLoggingComposition.ResponseTimeLogging @NoCacheComposition.NoCache @ErrorHandlingComposition.ErrorHandling @RequestLoggingComposition.RequestLogging @CorsComposition.Cors public class InvoiceGeneratorControllerV1 extends PoseidonController { public static final String CSV_DIR = "csvfile.invoice.dir"; public static final String CSV_URL = "/csv/invoice/"; @TokenAuthorize(requiredPermission = PermissionType.INVOICING) public Result generateInvoice(String callback) { JsonNode body = request().body().asJson(); ObjectMapper mapper = new ObjectMapper(); InvoiceData data ; try { data = mapper.readValue(body.toString(), InvoiceData.class); } catch (IOException e) { return badRequest("json post parameter parsing failure: " + e.getMessage()); } InvoiceGeneratorService invoiceGeneratorService = new InvoiceGeneratorService(currentApiUser().username); String phone = PoseidonPropertyService.getProperty("invoicing.phonenr"); String ourReference = currentApiUser().name + "/" + phone; if ( data == null || data.forecasts == null || data.forecasts.length == 0){ return badRequest("Ingen varslinger valgt for fakturering"); } List<InvoiceLine> invoiceData = invoiceGeneratorService.generateInvoiceLines(data,ourReference); if ( invoiceData == null||invoiceData.size() ==0) { throw new PoseidonException(Http.Status.INTERNAL_SERVER_ERROR,"Valgte varslinger genererte ingen fakturalinjer"); } String csv = invoiceGeneratorService.generateInvoice(invoiceData); String filename = writeCSVFileToDisk(data, csv); invoiceGeneratorService.markForecastsAsBilled(data.forecasts); CSVFile csvFile = new CSVFile(CSV_URL + filename,filename); return ok(Json.toJson(csvFile)); } @TokenAuthorize(requiredPermission = PermissionType.INVOICING) public Result listGeneratedFiles() { CSVDownloadService service = new CSVDownloadService(); List<CSVFile> csvFiles = service.getCsvFiles(CSV_DIR,CSV_URL); return ok(Json.toJson(csvFiles)); } private String writeCSVFileToDisk(InvoiceData data, String csv) { DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd_HH:mm_ZZZ"); data.filename = (data.filename!=null?data.filename + "-" :"").replace(" ","_"); DateTime now = PoseidonService.getNow(); String filename =data.filename + formatter.print(now) + ".csv"; String csvdir = PoseidonPropertyService.getProperty(CSV_DIR); csvdir = csvdir.endsWith("/")?csvdir:csvdir + "/"; new CsvWriter().writeCsvToFile(csv,filename,csvdir); return filename; } }